04 - DBOS 与 Restate
前置:03 篇的确定性约束。两个方案都在回应 Temporal 的接入成本问题。
本篇回答:不额外运维一套分布式系统,能不能拿到持久化执行?代价是什么?
本篇会用到的词:
| 词 | 意思 |
|---|---|
| 系统库 | DBOS 在你自己的 Postgres 里建的那套表,用来存工作流状态和每步的输出。「只要一个 Postgres」指的就是不用再额外部署别的东西 |
| PENDING | 工作流的一种状态,表示「开始了但还没跑完」。DBOS 的恢复就是从扫描这个状态开始的 |
| Conductor | DBOS 的协调组件。多实例部署时靠它仲裁,保证一个中断的任务只被一个实例捡起来 |
| 写放大 | 一次业务操作在数据库里引发的实际写入次数。DBOS 每个 step 一次写、每条工作流再加两次,步数多时这个量不可忽略 |
run() | Restate 的语句级标注:把不确定的调用包进去,框架就会记住它第一次的返回值。漏包一处不会报错,只在崩溃恢复时才出问题 |
| Awakeable | Restate 提供的一个可以被外部唤醒的挂起点,带唯一 ID。人工审批、等待回调都用它 |
一、DBOS:用一个 Postgres 承载状态
DBOS 的路线是取消独立的工作流服务,状态直接写进 Postgres。官方描述系统数据库里存的是"所有工作流检查点、步骤输出,以及调度和队列状态",且"每一个工作流输入和步骤输出都被持久化存储在系统数据库里"。